/*
04-树6 Complete Binary Search Tree
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 读取n个用户输入，排序，返回排好序的数组
int *read(int n);
void print(int* a, int n);
/**
 * 构建 Complete Binary Tree
 * T 结果树
 * A 原数组
 * aLeft 原数组开始下标
 * aRight 原数组结束下标
 * tRoot 结果树根节点下标
*/
void slove(int* T, int* A, int aLeft, int aRight, int tRoot);

int main() {
    int n;
    scanf("%d", &n);
    // 读取输入，src等同于ppt中的A
    int *src = read(n);
    // print(src, n);
    // 保存排序后的数组，等同于ppt中的T
    int *des = (int*)malloc(sizeof(int)*n);
    //
    slove(des, src, 0, n-1, 0);
    print(des, n);
    // 释放内存
    free(src);
    free(des);
}

// 为使用qsort提供的比较器
int compare(const void* a, const void* b) {
    return *((int*)a) - *((int*)b);
}

int *read(int n) {
    int *a = (int*)malloc(sizeof(int)*n);
    for (int i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    qsort(a, n, sizeof(int), compare);
    return a;
}

void print(int* a, int n) {
    int pb = 0;
    for (int i=0; i<n; i++, a++) {
        if (pb) {
            printf(" ");
        }
        printf("%d", *a);
        pb = 1;
    }
    printf("\n");
}

// 计算左子树的规模
int getLeftLength(int n) {
    // 二叉树高度
    int h = log2(n+1);
    // 最下层的节点个数
    int x = n - exp2(h) + 1;
    // 左子树最下层最多节点个数 = 2^(h-1)
    int p2_h_1 = exp2(h-1); 
    // 左子树最下层节点个数 x = min(x, p2_h_1)
    if (x > p2_h_1) {
        x = p2_h_1;
    }
    // 计算左子树的规模
    // 不计最下层的节点个数 = 2^(h-1) - 1，即p2_h_1-1
    // 加上左子树最下层节点个数 x
    return (p2_h_1 - 1) + x;
}

/**
 * 构建 Complete Binary Tree
 * T 结果树
 * A 原数组
 * aLeft 原数组开始下标
 * aRight 原数组结束下标
 * tRoot 结果树根节点下标
*/
void slove(int* T, int* A, int aLeft, int aRight, int tRoot) {
    int n = aRight - aLeft + 1;
    if (n < 1) return;
    // 计算左子树的规模
    int leftLength = getLeftLength(n);
    // printf("leftLength=%d\n", leftLength);
    // 填入目标数组
    T[tRoot] = A[aLeft + leftLength];
    // 计算左子树根节点数组下标
    int leftRoot = tRoot * 2 + 1;
    // 右子树根节点下标
    int rightRoot = leftRoot + 1;
    // 递归解决左子树
    slove(T, A, aLeft, aLeft+leftLength-1, leftRoot);
    // 递归解决右子树
    slove(T, A, aLeft+leftLength+1, aRight, rightRoot);
}